home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / msn / P2P / SLPMessage.pyo (.txt) < prev   
Python Compiled Bytecode  |  2008-10-13  |  12KB  |  334 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. import logging
  5. log = logging.getLogger('msn.slp.message')
  6. from util import callsback, get
  7.  
  8. class ParseError(Exception):
  9.     pass
  10.  
  11.  
  12. class Content(object):
  13.     SESSION_REQ = 'application/x-msnmsgr-sessionreqbody'
  14.     SESSION_CLOSE = 'application/x-msnmsgr-sessionclosebody'
  15.     TRANS_REQ = 'application/x-msnmsgr-transreqbody'
  16.     TRANS_RESP = 'application/x-msnmsgr-transrespbody'
  17.  
  18.  
  19. class MIMEMessage(object):
  20.     
  21.     def __init__(self, headers = { }, body = '', **moreheaders):
  22.         moreheaders.update(headers)
  23.         self.headers = moreheaders
  24.         self.body = body
  25.  
  26.     
  27.     def __getitem__(self, key):
  28.         return self.headers.__getitem__(key)
  29.  
  30.     
  31.     def __setitem__(self, key, val):
  32.         return self.headers.__setitem__(key, str(val))
  33.  
  34.     
  35.     def __str__(self):
  36.         res = []
  37.         headers = getattr(self, 'HEADERS', self.headers)
  38.         for key in headers:
  39.             if key in self.headers:
  40.                 res.append('%s: %s' % (key, self.headers[key]))
  41.                 continue
  42.         
  43.         for key in self.headers:
  44.             if key not in headers:
  45.                 res.append('%s: %s' % (key, self.headers[key]))
  46.                 continue
  47.         
  48.         res.append('')
  49.         res.append(self.body)
  50.         return '\r\n'.join(res)
  51.  
  52.     
  53.     def parse(cls, raw):
  54.         headers = { }
  55.         body = ''
  56.         lines = raw.split('\r\n')
  57.         line = lines.pop(0)
  58.         while line:
  59.             (key, val) = line.split(':', 1)
  60.             key = key.strip()
  61.             val = val.strip()
  62.             headers[key] = val
  63.             line = lines.pop(0)
  64.         if lines:
  65.             body = '\r\n'.join(lines)
  66.         
  67.         return cls(headers, body)
  68.  
  69.     parse = classmethod(parse)
  70.  
  71.  
  72. class SLPMessage(MIMEMessage):
  73.     
  74.     class Type(object):
  75.         UNKNOWN = 'unknown'
  76.         REQUEST = 'req'
  77.         RESPONSE = 'resp'
  78.  
  79.     HEADERS = [
  80.         'To',
  81.         'From',
  82.         'Via',
  83.         'CSeq',
  84.         'Call-ID',
  85.         'Max-Forwards']
  86.     STATUS_MESSAGE = {
  87.         200: '200 OK',
  88.         404: '404 Not Found',
  89.         500: '500 Internal Error',
  90.         603: '603 Decline' }
  91.     
  92.     def __init__(self, *a, **k):
  93.         self.method = ''
  94.         self.status = -1
  95.         MIMEMessage.__init__(self, *a, **k)
  96.  
  97.     
  98.     def message_type(self):
  99.         if self.method:
  100.             return self.Type.REQUEST
  101.         elif self.status != -1:
  102.             return self.Type.RESPONSE
  103.         else:
  104.             return self.Type.UNKNOWN
  105.  
  106.     message_type = property(message_type)
  107.     
  108.     def clear(self):
  109.         MIMEMessage.clear(self)
  110.         self.method = ''
  111.         self.status = -1
  112.  
  113.     
  114.     def request(cls, method, to = '', frm = '', branch = '', command_sequence = 0, call_id = '', max_forwards = 0):
  115.         self = cls()
  116.         self.method = method
  117.         self._SLPMessage__build(to, frm, branch, command_sequence, call_id, max_forwards)
  118.         return self
  119.  
  120.     request = classmethod(request)
  121.     
  122.     def response(cls, status, to = '', frm = '', branch = '', command_sequence = 0, call_id = '', max_forwards = 0):
  123.         self = cls()
  124.         self.status = status
  125.         int(self.status)
  126.         self._SLPMessage__build(to, frm, branch, command_sequence, call_id, max_forwards)
  127.         return self
  128.  
  129.     response = classmethod(response)
  130.     
  131.     def response_to(cls, status, msg):
  132.         self = cls()
  133.         self.status = status
  134.         int(self.status)
  135.         headers = []
  136.         for name in msg.headers:
  137.             if name in self.HEADERS:
  138.                 value = msg.headers[name][:]
  139.                 if name == 'CSeq':
  140.                     value = str(int(value) + 1)
  141.                 
  142.                 headers.append((name, value))
  143.                 continue
  144.         
  145.         self.headers.update(headers)
  146.         self.headers['To'] = msg.headers['From'][:]
  147.         self.headers['From'] = msg.headers['To'][:]
  148.         return self
  149.  
  150.     response_to = classmethod(response_to)
  151.     
  152.     def add_body(self, body = None):
  153.         if body != None:
  154.             content_type = body.content_type
  155.             body_str = str(body)
  156.             body_len = len(body_str)
  157.         else:
  158.             content_type = 'null'
  159.             body_str = ''
  160.             body_len = 0
  161.         self['Content-Type'] = content_type
  162.         self['Content-Length'] = body_len
  163.         self.body = body_str
  164.  
  165.     
  166.     def parse(cls, raw):
  167.         if raw.find('MSNSLP/1.0') < 0:
  168.             raise ParseError("message doesn't seem to be an MSNSLP/1.0 message", raw)
  169.         
  170.         (start_line, content) = raw.split('\r\n', 1)
  171.         start_line = start_line.split(' ')
  172.         if not start_line:
  173.             return None
  174.         
  175.         
  176.         try:
  177.             if start_line[0] in ('INVITE', 'BYE', 'ACK', '\x00\x00\x00'):
  178.                 method = start_line[0].strip()
  179.                 status = -1
  180.             else:
  181.                 method = ''
  182.                 status = int(start_line[1])
  183.             self = MIMEMessage.parse(content)
  184.             self.__class__ = cls
  185.             self.method = method
  186.             self.status = status
  187.             log.debug('SLPMessage received: method=%r, status=%r, headers=%r', self.method, self.status, dict(self.headers))
  188.             slpbody = SLPBody.parse(self.body, self['Content-Type'])
  189.             self.add_body(slpbody)
  190.             return self
  191.         except Exception:
  192.             e = None
  193.             import traceback as traceback
  194.             traceback.print_exc()
  195.             log.info('Bad data in SLPMessage.parse: %r', raw)
  196.             return None
  197.  
  198.  
  199.     parse = classmethod(parse)
  200.     
  201.     def __str__(self):
  202.         result = []
  203.         if self.method:
  204.             result.append('%s MSNMSGR:%s MSNSLP/1.0' % (self.method, self.headers['To'][9:-1]))
  205.         else:
  206.             result.append('MSNSLP/1.0 %s' % self.STATUS_MESSAGE[self.status])
  207.         result.append(MIMEMessage.__str__(self))
  208.         return '\r\n'.join(result)
  209.  
  210.     
  211.     def __build(self, to, frm, branch, command_sequence, call_id, max_forwards):
  212.         if to:
  213.             self['To'] = '<msnmsgr:%s>' % to
  214.         
  215.         if frm:
  216.             self['From'] = '<msnmsgr:%s>' % frm
  217.         
  218.         if branch:
  219.             self['Via'] = 'MSNSLP/1.0/TLP ;branch=%s' % branch
  220.         
  221.         self['CSeq'] = str(command_sequence) + ' '
  222.         if call_id:
  223.             self['Call-ID'] = call_id
  224.         
  225.         self['Max-Forwards'] = max_forwards
  226.  
  227.  
  228.  
  229. class SLPBody(MIMEMessage):
  230.     
  231.     def __init__(self, content_type, *a, **k):
  232.         MIMEMessage.__init__(self, *a, **k)
  233.         self.content_type = content_type
  234.  
  235.     
  236.     def parse(cls, raw, content_type):
  237.         raw = raw[:-1]
  238.         self = MIMEMessage.parse(raw)
  239.         self.__class__ = cls
  240.         self.content_type = content_type
  241.         log.debug('SLPBody received: content_type=%r, headers=%r', self.content_type, dict(self.headers))
  242.         return self
  243.  
  244.     parse = classmethod(parse)
  245.     
  246.     def __str__(self):
  247.         return MIMEMessage.__str__(self) + '\x00'
  248.  
  249.  
  250.  
  251. class SLPSessionInviteBody(SLPBody):
  252.     
  253.     def __init__(self, *a, **k):
  254.         SLPBody.__init__(self, Content.SESSION_REQ, *a, **k)
  255.  
  256.     
  257.     def request(cls, eufguid, sessionid, chan_state, appid, context, body = ''):
  258.         headers = {
  259.             'EUF-GUID': eufguid,
  260.             'SessionID': sessionid,
  261.             'AppID': appid,
  262.             'Context': context }
  263.         return cls(headers, body)
  264.  
  265.     request = classmethod(request)
  266.     
  267.     def response(cls, sessionid, chan_state, body = ''):
  268.         headers = {
  269.             'SessionID': sessionid }
  270.         return cls(headers, body)
  271.  
  272.     response = classmethod(response)
  273.     
  274.     def response_to(cls, msg):
  275.         return cls.response(msg.headers['SessionID'], msg.headers['SChannelState'], '')
  276.  
  277.     response_to = classmethod(response_to)
  278.  
  279.  
  280. class SLPTransferInviteBody(SLPBody):
  281.     
  282.     def __init__(self, bridges, netid, conntype, upnp, icf, hashednonce, sessionid, chanstate, body):
  283.         headers = { }
  284.         headers['Bridges'] = bridges
  285.         headers['NetID'] = netid
  286.         headers['Conn-Type'] = conntype
  287.         headers['UPnPNat'] = upnp
  288.         headers['ICF'] = icf
  289.         headers['Hashed-Nonce'] = hashednonce
  290.         headers['SessionID'] = sessionid
  291.         SLPBody.__init__(self, Content.TRANS_REQ, headers, body)
  292.  
  293.     
  294.     def request(cls, bridges, netid, conntype, upnp, icf, hashednonce, sessionid, chanstate, body):
  295.         return cls(bridges, netid, conntype, upnp, icf, hashednonce, sessionid, chanstate, body)
  296.  
  297.     request = classmethod(request)
  298.     
  299.     def response(cls, *a, **k):
  300.         raise TypeError('Invite only available as request')
  301.  
  302.     response = classmethod(response)
  303.  
  304.  
  305. class SLP_Bye(SLPBody):
  306.     
  307.     def __init__(self):
  308.         SLPBody.__init__(self, Content.SESSION_CLOSE)
  309.  
  310.  
  311.  
  312. class SLP_404(SLPMessage):
  313.     
  314.     def response_to(cls, bad_msg):
  315.         return SLPMessage.response_to(404, bad_msg)
  316.  
  317.     response_to = classmethod(response_to)
  318.  
  319.  
  320. class SLP_500(SLPMessage):
  321.     
  322.     def response_to(cls, bad_msg):
  323.         return SLPMessage.response_to(500, bad_msg)
  324.  
  325.     response_to = classmethod(response_to)
  326.  
  327.  
  328. def main():
  329.     data = 'INVITE MSNMSGR:bob@hotmail.com MSNSLP/1.0\r\nTo: <msnmsgr:bob@hotmail.com>\r\nFrom: <msnmsgr:alice@hotmail.com>\r\nVia: MSNSLP/1.0/TLP ;branch={33517CE4-02FC-4428-B6F4-39927229B722}\r\nCSeq: 0 \r\nCall-ID: {9D79AE57-1BD5-444B-B14E-3FC9BB2B5D58}\r\nMax-Forwards: 0\r\nContent-Type: application/x-msnmsgr-sessionreqbody\r\nContent-Length: 326\r\n\r\nEUF-GUID: {A4268EEC-FEC5-49E5-95C3-F126696BDBF6}\r\nSessionID: 1980589\r\nAppID: 1\r\nContext: PG1zbm9iaiBDcmVhdG9yPSJidWRkeTFAaG90bWFpbC5jb20iIFNpemU9IjI0NTM5IiBUeXBlPSIzIiBMb2NhdGlvbj0iVEZSMkMudG1wIiBGcmllbmRseT0iQUFBPSIgU0hBMUQ9InRyQzhTbEZ4MnNXUXhaTUlCQVdTRW5YYzhvUT0iIFNIQTFDPSJVMzJvNmJvc1p6bHVKcTgyZUF0TXB4NWRJRUk9Ii8+DQoA\r\n\r\n\x00'
  330.  
  331. if __name__ == '__main__':
  332.     main()
  333.  
  334.